package com.ruoyi.framework.web.service;


import com.ruoyi.system.service.IEmployeeLoginService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;


/**
 * 员工用户验证处理（仿照若依格式）
 *
 * @author ruoyi
 */
@Service("employeeUserDetailsService")
public class EmployeeUserDetailsServiceImpl implements UserDetailsService {

    private static final Logger log = LoggerFactory.getLogger(EmployeeUserDetailsServiceImpl.class);

    @Autowired
    private IEmployeeLoginService employeeService;

    @Autowired
    private SysPermissionService permissionService;

    /**
     * 根据手机号加载员工用户信息（用户名即手机号）
     *
     * @param phone 手机号（作为用户名）
     * @return 封装员工信息和权限的UserDetails对象
     * @throws UsernameNotFoundException 当手机号不存在或状态异常时抛出
     */
    @Override
    public UserDetails loadUserByUsername(String phone) throws UsernameNotFoundException {
        // 1. 通过服务层获取员工信息（遵循若依不直接注入Mapper的规范）
        SysUser employee = employeeService.selectEmployeeByPhone(phone);

        // 2. 校验员工是否存在
        if (StringUtils.isNull(employee)) {
            log.info("员工登录失败：手机号 {} 不存在", phone);
            throw new ServiceException(MessageUtils.message("employee.not.exists"));
        }

        // 3. 校验员工是否被删除（del_flag=2）
        if (UserStatus.DELETED.getCode().equals(employee.getDelFlag())) {
            log.info("员工登录失败：手机号 {} 对应的员工已被删除", phone);
            throw new ServiceException(MessageUtils.message("employee.deleted"));
        }

        // // 4. 校验员工状态是否正常（试用/正式）
        // if (!"probation".equals(employee.getStatus()) && !"formal".equals(employee.getStatus())) {
        //     log.info("员工登录失败：手机号 {} 状态异常，当前状态：{}", phone, employee.getStatus());
        //     throw new ServiceException(MessageUtils.message("employee.status.invalid"));
        // }

        // 5. 员工账号状态校验（密码策略/登录频率等，验证码登录场景简化）
        validateEmployee(employee);

        // 6. 构建并返回包含权限的登录用户对象
        return createLoginUser(employee);
    }

    /**
     * 员工账号状态校验（可扩展密码策略/登录频率等规则）
     *
     * @param employee 员工实体对象
     */
    private void validateEmployee(SysUser employee) {
        // 示例：验证码登录无需密码校验，可添加账号锁定/登录频率限制等逻辑
    }

    /**
     * 创建员工登录用户对象（仿照若依UserDetailsServiceImpl格式）
     *
     * @param employee 员工实体
     * @return 封装用户信息和权限的LoginUser对象
     */
    public UserDetails createLoginUser(SysUser employee)
    {
        return new LoginUser(employee.getUserId(), employee.getDeptId(), employee, permissionService.getMenuPermission(employee));
    }
}